let express = require('express');
let path = require('path');
let multer = require('multer');
let bodyParser = require("body-parser");
let userModul = require('./moduls/user.js');
let artMoudel = require("./moduls/article.js");
let comModel = require("./moduls/comment.js")
let crypto = require('crypto');
let session = require("express-session");
let app = express();

// 设置ejs模板引擎
app.set("view engine", 'ejs')
//  设置ejs引擎目录
app.set('views', path.join(__dirname, "views"));
// 设置静态
app.use(express.static('public'));
//设置文件上传配置
const storage = multer.diskStorage({
	destination: function(req, file, cb) {
		cb(null, path.join('public', 'img'))
	},
	filename: function(req, file, cb) {
		const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
		cb(null, file.fieldname + '-' + uniqueSuffix + file.originalname.slice(file.originalname
			.lastIndexOf(".")))
	}
})
const upload = multer({
	storage: storage
})
// 解析post请求参数
let urlencodedParser = bodyParser.urlencoded({
	extended: false
});
// 设置session
let sessioned = session({
	secret: "yyds",
	cookie: {
		maxAge: 1000 * 60 * 60 * 24
	}
})
app.use(sessioned);
// 设置网页头部传参
app.use(function(req, res, next) {
	// 中间件给每个render设置第二个参数
	res.locals.user = req.session.user;
	next()
})

// 未登录拦截
app.use(function(req,res,next){
	// 获取请求
	let url = req.originalUrl;
	// 拦截 --不包含登录和注册
	if(url == '/article' && !req.session.user){
		return res.redirect('/login');
	}
	next();
})

// 注册
app.get('/register', function(req, res) {
	res.render("reg.ejs")
})
app.post('/reg', upload.single('img'), function(req, res, next) {
	// 判断名称
	if (!req.body["username"]) {
		res.send("注册失败-名字必填！！！");
		return;
	}
	// 判断密码
	if (!req.body["passwd"]) {
		res.send("注册失败-密码必填！！！");
		return;
	}
	// 判断图片
	if (!req.file.filename) {
		res.send("注册失败-图像必填！！！");
		return;
	}
	// 获取用户信息
	let userName = req.body["username"];
	let passWord = crypto.createHmac('sha256', "yyds").update(req.body["passwd"]).digest('hex');
	let imgPath = path.join('img', req.file.filename);
	let user = new userModul({
		username: userName,
		password: passWord,
		imgpath: imgPath
	})
	// 写入数据库
	user.save(function(err) {
		// 判断写入成功
		
		if (err) {
			res.send("注册失败")
			return;
		}
		res.send("注册成功");
	})
})

// 登录
app.get('/login', function(req, res) {
	res.render("login.ejs")
})
app.post('/cheklogin', urlencodedParser, function(req, res) {
	// 判断账号
	if (!req.body['username']) {
		res.send("登录失败-密码错误！！")
	}
	// 判断密码
	let passwd = crypto.createHmac('sha256', "yyds").update(req.body["passwd"]).digest('hex');
	userModul.findOne({
		username: req.body['username'],
		password: passwd
	}, function(err, result) {
		// 成功
		if (result) {
			// 保存session
			req.session.user = {
				_id: result._id,
				username: result.username,
				imgpath: result.imgpath
			}
			res.redirect("/")
			return;
		}
		res.send("账号/密码错误！！！")
	})
})

// 退出登录
app.get("/logout", function(req, res) {
	// 删除session
	req.session.destroy(function(err) {
		res.redirect('/')
	})
})

// 发表
app.get("/send", function(req, res) {
	res.render("send.ejs")
})
app.post('/article', urlencodedParser, function(req, res) {
	// 标题
	let title = req.body['title'];
	let context = req.body['content'];
	// 判断参数
	if (!req.session.user) {
		res.send("发表失败");
		return;
	}
	let _id = req.session.user._id;
	if (title == '' || context == '') {
		res.send("发表失败");
		return;
	}
	let art = new artMoudel({
		user: _id,
		title: title,
		context: context
	})
	art.save(function(err) {
		// 判断写入成功
		if (err) {
			res.send("发表失败")
		}
		res.redirect('/')
	})
})

// 主页
app.get("/", function(req, res) {
	// 请求评论列表
	artMoudel.find({}).sort({ctime:-1}).populate("user",'username imgpath').exec(function(err, result) {
		if (result) {
			res.render("index.ejs", {result})
			return;
		}
		
		result = {}
		res.render("index.ejs", {result})
	})

})

// 评论详情
app.get('/info/:id',function(req,res){
	// 获取文章id
	let id= req.params.id;
	// 更新浏览量
	artMoudel.update({_id:id},{$inc:{browse:1}})
	//根据文章id查看具体文章
	artMoudel.findById(id).populate("user",'username imgpath').exec(function(err, result) {
		// 根据文章id寻找评论
		comModel.find({article:id}).sort({ctime:-1}).populate("user",'username imgpath').exec(function(e,com){
			// 评论为空
			if (!com || !result) {
				res.send('查询错误')
				return;
			}
			res.render("info.ejs", {com:com,result:result})
		})
		
	})
})

// 发表评论
app.post("/msg/:id",urlencodedParser,function(req,res){
	// 获取评论id
	let id= req.params.id;
	// 更新评论
	artMoudel.update({_id:id},{$inc:{comment:1}},function(err,d){
		console.log(d,err);
	})
	let com = new comModel({
		user:req.session.user._id,
		article:id,
		context:req.body['context']
	});
	com.save(function(err) {
		// 判断写入成功
		if (err) {
			res.send("评论失败")
		}
		res.redirect(`/info/${id}`)
	})

})

app.listen(8080, function() {
	console.log("start....")
})
